[Bf-blender-cvs] [78e5ec1] opensubdiv-modifier: OpenSubdiv: Send proper UV coordinates to the mesh evaluator

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


Commit: 78e5ec1f0637f5d7dc2b3ba1255e531af4ee6ee1
Author: Sergey Sharybin
Date:   Tue Jul 22 18:56:10 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rB78e5ec1f0637f5d7dc2b3ba1255e531af4ee6ee1

OpenSubdiv: Send proper UV coordinates to the mesh evaluator

Doe now only send active UV layer coordinates, which is enough
for textured shading but which would need to be extended in order
to support full GLSL shaded mode.

This slows things down a bit, but afraid it's what we need to pay..

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

M	intern/opensubdiv/opensubdiv_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.cc b/intern/opensubdiv/opensubdiv_capi.cc
index d47661c..e4400be 100644
--- a/intern/opensubdiv/opensubdiv_capi.cc
+++ b/intern/opensubdiv/opensubdiv_capi.cc
@@ -333,27 +333,6 @@ struct OpenSubdiv_GLMesh *openSubdiv_createOsdGLMeshFromEvaluator(
 	topology = (OsdUtilSubdivTopology *)openSubdiv_getEvaluatorTopologyDescr(
 		evaluator_descr);
 
-#if 0
-	if (topology->fvNames.size() == 0) {
-		for (int i = 0; i < 8840; ++i) {
-			topology->fvData.push_back(0.0f);
-			topology->fvData.push_back(0.0f);
-
-			topology->fvData.push_back(1.0f);
-			topology->fvData.push_back(0.0f);
-
-			topology->fvData.push_back(1.0f);
-			topology->fvData.push_back(1.0f);
-
-			topology->fvData.push_back(0.0f);
-			topology->fvData.push_back(1.0f);
-		}
-
-		topology->fvNames.push_back("u");
-		topology->fvNames.push_back("v");
-	}
-#endif
-
 	if (util_mesh.Initialize(*topology,
 	                         NULL,
 	                         get_osd_scheme(scheme)) == false) {
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index b577326..44cd5c8 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -36,6 +36,7 @@
 #include "CCGSubSurf.h"
 #include "BKE_subsurf.h"
 
+#include "BKE_DerivedMesh.h"
 #include "BKE_subsurf.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
@@ -469,6 +470,9 @@ struct CCGSubSurf {
 	unsigned int osd_vao;
 	bool skip_grids;
 	short osd_compute;
+
+	bool osd_uvs_invalid;
+	int osd_uv_index;
 #endif
 };
 
@@ -933,6 +937,8 @@ CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *a
 		ss->osd_vao = 0;
 		ss->skip_grids = false;
 		ss->osd_compute = 0;
+		ss->osd_uvs_invalid = false;
+		ss->osd_uv_index = -1;
 #endif
 
 		return ss;
@@ -2535,6 +2541,58 @@ static bool opensubdiv_initEvaluator(CCGSubSurf *ss)
 	                                       scheme) != 0;
 }
 
+void ccgSubSurf_setUVCoordsFromDM(CCGSubSurf *ss, DerivedMesh *dm)
+{
+	/* TODO(sergey): Do we have shorter way to do this? */
+	int active = CustomData_get_active_layer(&dm->loopData,
+	                                         CD_MLOOPUV);
+	MLoopUV *mloopuv = CustomData_get_layer_n(&dm->loopData,
+	                                          CD_MLOOPUV,
+	                                          active);
+	bool mpoly_allocated;
+	MPoly *mpoly = DM_get_poly_array(dm, &mpoly_allocated);
+	int i;
+
+	if (active != ss->osd_uv_index) {
+		ss->osd_uvs_invalid = true;
+	}
+
+	if (mloopuv == NULL || !ss->osd_uvs_invalid) {
+		return;
+	}
+
+	ss->osd_uvs_invalid = false;
+	ss->osd_uv_index = active;
+	if (ss->osd_mesh) {
+		ss->osd_mesh_invalid = true;
+	}
+
+	openSubdiv_evaluatorFVDataClear(ss->osd_evaluator);
+	for (i = 0; i < ss->fMap->curSize; i++) {
+		CCGFace *face = (CCGFace *) ss->fMap->buckets[i];
+		for (; face; face = face->next) {
+			int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(face));
+			MPoly *mp = &mpoly[index];
+			int S;
+			BLI_assert(face->numVerts == mp->totloop);
+			for (S = 0; S < face->numVerts; ++S) {
+				MLoopUV *loopuv = &mloopuv[mp->loopstart + S];
+				openSubdiv_evaluatorFVDataPush(ss->osd_evaluator,
+				                               loopuv->uv[0]);
+				openSubdiv_evaluatorFVDataPush(ss->osd_evaluator,
+				                               loopuv->uv[1]);
+			}
+		}
+	}
+
+	openSubdiv_evaluatorFVNamePush(ss->osd_evaluator, "u");
+	openSubdiv_evaluatorFVNamePush(ss->osd_evaluator, "v");
+
+	if (mpoly_allocated) {
+		MEM_freeN(mpoly);
+	}
+}
+
 static bool check_topology_changed(CCGSubSurf *ss)
 {
 	int num_vertices,
@@ -2615,6 +2673,8 @@ static bool opensubdiv_ensureEvaluator(CCGSubSurf *ss)
 			if (ss->osd_mesh) {
 				ss->osd_mesh_invalid = true;
 			}
+
+			ss->osd_uvs_invalid = true;
 		}
 	}
 	if (ss->osd_evaluator == NULL) {
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 970da85..db74a59 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -194,6 +194,9 @@ bool ccgSubSurf_prepareGLMesh(CCGSubSurf *ss, bool use_osd_glsl);
 void ccgSubSurf_drawGLMesh(CCGSubSurf *ss, bool fill_quads,
                            int start_partition, int num_partitions);
 void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids);
+
+struct DerivedMesh;
+void ccgSubSurf_setUVCoordsFromDM(CCGSubSurf *ss, struct DerivedMesh *dm);
 #endif
 
 #endif  /* __CCGSUBSURF_H__ */
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 190f960..e191d95 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2444,9 +2444,12 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
 
 #ifdef WITH_OPENSUBDIV
 	if (ccgdm->useGpuBackend) {
+		/* TODO(sergey): Do we have shorter way to do this? */
+		int active = CustomData_get_active_layer(&ccgdm->dm.polyData,
+		                                         CD_MTEXPOLY);
 		MTexPoly *mtexpoly = CustomData_get_layer_n(&ccgdm->dm.polyData,
 		                                            CD_MTEXPOLY,
-		                                            0);
+		                                            active);
 
 		CCGFaceIterator *fi;
 
@@ -4283,6 +4286,10 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
 
 			if (flags & SUBSURF_ALLOC_PAINT_MASK)
 				ccgSubSurf_setNumLayers(ss, 4);
+
+#ifdef WITH_OPENSUBDIV
+			ccgSubSurf_setUVCoordsFromDM(ss, dm);
+#endif
 		}
 	}




More information about the Bf-blender-cvs mailing list