[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43901] branches/bmesh/blender/source/ blender: support for 'origspace' data layer - used for hair on subsurf mesh .

Campbell Barton ideasman42 at gmail.com
Sun Feb 5 12:30:31 CET 2012


Revision: 43901
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43901
Author:   campbellbarton
Date:     2012-02-05 11:30:26 +0000 (Sun, 05 Feb 2012)
Log Message:
-----------
support for 'origspace' data layer - used for hair on subsurf mesh.

currently only works for 3/4 sided faces.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/particle.c
    branches/bmesh/blender/source/blender/blenkernel/intern/particle_system.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/makesdna/DNA_customdata_types.h
    branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_particlesystem.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-02-05 10:15:54 UTC (rev 43900)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-02-05 11:30:26 UTC (rev 43901)
@@ -484,6 +484,7 @@
 void *DM_get_edge_data_layer(struct DerivedMesh *dm, int type);
 void *DM_get_tessface_data_layer(struct DerivedMesh *dm, int type);
 void *DM_get_poly_data_layer(struct DerivedMesh *dm, int type);
+void *DM_get_loop_data_layer(struct DerivedMesh *dm, int type);
 
 /* custom data setting functions
  * copy supplied data into first layer of type using layer's copy function
@@ -676,6 +677,8 @@
 /* Set object's bounding box based on DerivedMesh min/max data */
 void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
 
+void DM_init_origspace(DerivedMesh *dm);
+
 /* debug only */
 #ifndef NDEBUG
 char *DM_debug_info(DerivedMesh *dm);

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2012-02-05 10:15:54 UTC (rev 43900)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2012-02-05 11:30:26 UTC (rev 43901)
@@ -267,7 +267,7 @@
 void mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata,
                                  struct CustomData *pdata, int lindex[4], int findex,
                                  const int polyindex, const int mf_len,
-                                 const int numTex, const int numCol, const int hasWCol);
+                                 const int numTex, const int numCol, const int hasWCol, const int hasOrigSpace);
 
 #ifdef __cplusplus
 }

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-02-05 10:15:54 UTC (rev 43900)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-02-05 11:30:26 UTC (rev 43901)
@@ -562,6 +562,11 @@
 	return CustomData_get_layer(&dm->polyData, type);
 }
 
+void *DM_get_loop_data_layer(DerivedMesh *dm, int type)
+{
+	return CustomData_get_layer(&dm->loopData, type);
+}
+
 void DM_set_vert_data(DerivedMesh *dm, int index, int type, void *data)
 {
 	CustomData_set(&dm->vertData, index, type, data);
@@ -1504,9 +1509,12 @@
 				add_orco_dm(ob, NULL, dm, clothorcodm, CD_CLOTH_ORCO);
 
 			/* add an origspace layer if needed */
-			if(((CustomDataMask)GET_INT_FROM_POINTER(curr->link)) & CD_MASK_ORIGSPACE)
-				if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
-					DM_add_tessface_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
+			if(((CustomDataMask)GET_INT_FROM_POINTER(curr->link)) & CD_MASK_ORIGSPACE_MLOOP) {
+				if(!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) {
+					DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
+					DM_init_origspace(dm);
+				}
+			}
 
 			ndm = mti->applyModifier(md, ob, dm, useRenderParams, useCache);
 
@@ -1825,9 +1833,12 @@
 
 			DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX);
 
-			if(mask & CD_MASK_ORIGSPACE)
-				if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
-					DM_add_tessface_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
+			if(mask & CD_MASK_ORIGSPACE_MLOOP) {
+				if(!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) {
+					DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
+					DM_init_origspace(dm);
+				}
+			}
 			
 			if (mti->applyModifierEM)
 				ndm = mti->applyModifierEM(md, ob, em, dm);
@@ -2859,6 +2870,30 @@
 /* --- NAVMESH (end) --- */
 
 
+void DM_init_origspace(DerivedMesh *dm)
+{
+	static float default_osf[4][2] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};
+
+	OrigSpaceLoop *lof_array = CustomData_get_layer(&dm->loopData, CD_ORIGSPACE_MLOOP);
+	OrigSpaceLoop *lof;
+	const int numpoly = dm->getNumPolys(dm);
+	// const int numloop = dm->getNumLoops(dm);
+	MPoly *mp = dm->getPolyArray(dm);
+	int i, j;
+
+	for (i = 0; i < numpoly; i++, mp++) {
+		/* only quads/tri's for now */
+		if (mp->totloop == 3 || mp->totloop == 4) {
+			lof = lof_array + mp->loopstart;
+			for (j = 0; j < mp->totloop; j++, lof++) {
+				copy_v2_v2(lof->uv, default_osf[j]);
+			}
+		}
+	}
+}
+
+
+
 /* derivedmesh info printing function,
  * to help track down differences DM output */
 
@@ -2910,6 +2945,10 @@
 	dm_debug_info_layers(dynstr, dm, dm->getVertDataArray);
 	BLI_dynstr_appendf(dynstr, "    ),\n");
 
+	BLI_dynstr_appendf(dynstr, "    'loopLayers': (\n");
+	dm_debug_info_layers(dynstr, dm, DM_get_loop_data_layer);
+	BLI_dynstr_appendf(dynstr, "    ),\n");
+
 	BLI_dynstr_appendf(dynstr, "    'edgeLayers': (\n");
 	dm_debug_info_layers(dynstr, dm, dm->getEdgeDataArray);
 	BLI_dynstr_appendf(dynstr, "    ),\n");
@@ -2918,7 +2957,7 @@
 	dm_debug_info_layers(dynstr, dm, dm->getTessFaceDataArray);
 	BLI_dynstr_appendf(dynstr, "    ),\n");
 
-	BLI_dynstr_appendf(dynstr, "    'PolyLayers': (\n");
+	BLI_dynstr_appendf(dynstr, "    'polyLayers': (\n");
 	dm_debug_info_layers(dynstr, dm, DM_get_poly_data_layer);
 	BLI_dynstr_appendf(dynstr, "    ),\n");
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2012-02-05 10:15:54 UTC (rev 43900)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2012-02-05 11:30:26 UTC (rev 43901)
@@ -871,6 +871,77 @@
 	}
 }
 
+/* origspace is almost exact copy of mloopuv's, keep in sync */
+static void layerCopyValue_mloop_origspace(void *source, void *dest)
+{
+	OrigSpaceLoop *luv1 = source, *luv2 = dest;
+
+	copy_v2_v2(luv2->uv, luv1->uv);
+}
+
+static int layerEqual_mloop_origspace(void *data1, void *data2)
+{
+	OrigSpaceLoop *luv1 = data1, *luv2 = data2;
+
+	return len_squared_v2v2(luv1->uv, luv2->uv) < 0.00001f;
+}
+
+static void layerMultiply_mloop_origspace(void *data, float fac)
+{
+	OrigSpaceLoop *luv = data;
+
+	mul_v2_fl(luv->uv, fac);
+}
+
+static void layerInitMinMax_mloop_origspace(void *vmin, void *vmax)
+{
+	OrigSpaceLoop *min = vmin, *max = vmax;
+
+	INIT_MINMAX2(min->uv, max->uv);
+}
+
+static void layerDoMinMax_mloop_origspace(void *data, void *vmin, void *vmax)
+{
+	OrigSpaceLoop *min = vmin, *max = vmax, *luv = data;
+
+	DO_MINMAX2(luv->uv, min->uv, max->uv);
+}
+
+static void layerAdd_mloop_origspace(void *data1, void *data2)
+{
+	OrigSpaceLoop *l1 = data1, *l2 = data2;
+
+	add_v2_v2(l1->uv, l2->uv);
+}
+
+static void layerInterp_mloop_origspace(void **sources, float *weights,
+                                float *sub_weights, int count, void *dest)
+{
+	OrigSpaceLoop *mluv = dest;
+	float *uv= mluv->uv;
+	int i;
+
+	zero_v2(uv);
+
+	if (sub_weights) {
+		const float *sub_weight = sub_weights;
+		for(i = 0; i < count; i++) {
+			float weight = weights ? weights[i] : 1.0f;
+			OrigSpaceLoop *src = sources[i];
+			madd_v2_v2fl(uv, src->uv, (*sub_weight) * weight);
+			sub_weight++;
+		}
+	}
+	else {
+		for(i = 0; i < count; i++) {
+			float weight = weights ? weights[i] : 1;
+			OrigSpaceLoop *src = sources[i];
+			madd_v2_v2fl(uv, src->uv, weight);
+		}
+	}
+}
+/* --- end copy */
+
 static void layerInterp_mcol(void **sources, float *weights,
 							 float *sub_weights, int count, void *dest)
 {
@@ -1079,7 +1150,11 @@
 	{sizeof(float), "", 0, "BevelWeight", NULL, NULL, layerInterp_bweight},
 	/* 30: CD_CREASE */
 	{sizeof(float), "", 0, "SubSurfCrease", NULL, NULL, layerInterp_bweight},
-	/* 31: CD_WEIGHT_MLOOPCOL */
+    /* 31: CD_ORIGSPACE_MLOOP */
+	{sizeof(OrigSpaceLoop), "OrigSpaceLoop", 1, "OS Loop", NULL, NULL, layerInterp_mloop_origspace, NULL, NULL,
+	 layerEqual_mloop_origspace, layerMultiply_mloop_origspace, layerInitMinMax_mloop_origspace,
+	 layerAdd_mloop_origspace, layerDoMinMax_mloop_origspace, layerCopyValue_mloop_origspace},
+	/* 32: CD_WEIGHT_MLOOPCOL */
 	{sizeof(MLoopCol), "MLoopCol", 1, "WeightLoopCol", NULL, NULL, layerInterp_mloopcol, NULL,
 	 layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol,
 	 layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol},
@@ -1100,7 +1175,7 @@
 /* BMESH ONLY */
 	,
 	/* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight",
-	/* 30-31 */ "CDSubSurfCrease", "CDWeightLoopCol"
+	/* 30-32 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDWeightLoopCol"
 /* END BMESH ONLY */
 
 };
@@ -1123,7 +1198,7 @@
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
 	CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
 	CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_WEIGHT_MLOOPCOL |
-	CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | 
+	CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT |
 	CD_MASK_WEIGHT_MCOL | CD_MASK_NORMAL | CD_MASK_SHAPEKEY | CD_MASK_RECAST |
 	CD_MASK_ORIGINDEX | CD_MASK_POLYINDEX;
 const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
@@ -2395,6 +2470,9 @@
 		else if (ldata->layers[i].type == CD_WEIGHT_MLOOPCOL) {
 			CustomData_add_layer_named(fdata, CD_WEIGHT_MCOL, CD_CALLOC, NULL, total, ldata->layers[i].name);
 		}
+		else if (ldata->layers[i].type == CD_ORIGSPACE_MLOOP) {
+			CustomData_add_layer_named(fdata, CD_ORIGSPACE, CD_CALLOC, NULL, total, ldata->layers[i].name);
+		}
 	}
 }
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2012-02-05 10:15:54 UTC (rev 43900)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2012-02-05 11:30:26 UTC (rev 43901)
@@ -2177,7 +2177,8 @@
                                  /* cache values to avoid lookups every time */
                                  const int numTex, /* CustomData_number_of_layers(pdata, CD_MTEXPOLY) */
                                  const int numCol, /* CustomData_number_of_layers(ldata, CD_MLOOPCOL) */
-                                 const int hasWCol /* CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL) */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list