[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49412] trunk/blender/source/blender: support for curve orco uv's as UV's in cycles.

Campbell Barton ideasman42 at gmail.com
Tue Jul 31 15:43:27 CEST 2012


Revision: 49412
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49412
Author:   campbellbarton
Date:     2012-07-31 13:43:26 +0000 (Tue, 31 Jul 2012)
Log Message:
-----------
support for curve orco uv's as UV's in cycles.

ideally these would be used as generated coordinates, but this is tricly because cycles calculates its own orco's and doesnt know about curve settings.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c

Modified: trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2012-07-31 13:17:07 UTC (rev 49411)
+++ trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2012-07-31 13:43:26 UTC (rev 49412)
@@ -61,12 +61,14 @@
 /* merge verts  */
 DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap);
 
+DerivedMesh *CDDM_from_curve_orco(struct Scene *scene, struct Object *ob);
+
 /* creates a CDDerivedMesh from the given curve object */
 struct DerivedMesh *CDDM_from_curve(struct Object *ob);
 
 /* creates a CDDerivedMesh from the given curve object and specified dispbase */
 /* useful for OrcoDM creation for curves with constructive modifiers */
-DerivedMesh *CDDM_from_curve_displist(struct Object *ob, struct ListBase *dispbase);
+DerivedMesh *CDDM_from_curve_displist(struct Object *ob, struct ListBase *dispbase, int **orco_index_ptr);
 
 /* Copies the given DerivedMesh with verts, faces & edges stored as
  * custom element data.

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-07-31 13:17:07 UTC (rev 49411)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-07-31 13:43:26 UTC (rev 49412)
@@ -143,9 +143,13 @@
                              int *totloop, int *totpoly);
 int BKE_mesh_nurbs_displist_to_mdata(struct Object *ob, struct ListBase *dispbase, struct MVert **allvert, int *_totvert,
                                      struct MEdge **alledge, int *_totedge, struct MLoop **allloop, struct MPoly **allpoly,
-                                     int *_totloop, int *_totpoly);
+                                     int *_totloop, int *_totpoly, int **orco_index_ptr);
+void BKE_mesh_nurbs_to_mdata_orco(struct MPoly *mpoly, int totpoly,
+                                  struct MLoop *mloops, struct MLoopUV *mloopuvs,
+                                  float (*orco)[3], int (*orco_index)[4]);
 void BKE_mesh_from_nurbs(struct Object *ob);
-void BKE_mesh_from_nurbs_displist(struct Object *ob, struct ListBase *dispbase);
+void BKE_mesh_from_nurbs_displist(struct Object *ob, struct ListBase *dispbase,
+                                  int **orco_index_ptr);
 void BKE_mesh_from_curve(struct Scene *scene, struct Object *ob);
 void free_dverts(struct MDeformVert *dvert, int totvert);
 void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-07-31 13:17:07 UTC (rev 49411)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-07-31 13:43:26 UTC (rev 49412)
@@ -52,6 +52,7 @@
 #include "BKE_paint.h"
 #include "BKE_utildefines.h"
 #include "BKE_tessmesh.h"
+#include "BKE_curve.h"
 
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
@@ -1709,11 +1710,51 @@
 
 DerivedMesh *CDDM_from_curve(Object *ob)
 {
-	return CDDM_from_curve_displist(ob, &ob->disp);
+	return CDDM_from_curve_displist(ob, &ob->disp, NULL);
 }
 
-DerivedMesh *CDDM_from_curve_displist(Object *ob, ListBase *dispbase)
+DerivedMesh *CDDM_from_curve_orco(struct Scene *scene, Object *ob)
 {
+	int *orco_index_ptr = NULL;
+	int (*orco_index)[4] = NULL;
+	float (*orco)[3] = NULL;
+	DerivedMesh *dm = CDDM_from_curve_displist(ob, &ob->disp, &orco_index_ptr);
+
+	if (orco_index_ptr) {
+		orco = (float (*)[3])BKE_curve_make_orco(scene, ob);
+	}
+
+	if (orco && orco_index_ptr) {
+		const char *uvname = "Orco";
+
+		int totpoly = dm->getNumPolys(dm);
+
+		MPoly *mpolys = dm->getPolyArray(dm);
+		MLoop *mloops = dm->getLoopArray(dm);
+
+		MLoopUV *mloopuvs;
+
+		CustomData_add_layer_named(&dm->polyData, CD_MTEXPOLY, CD_DEFAULT, NULL, dm->numPolyData, uvname);
+		mloopuvs = CustomData_add_layer_named(&dm->loopData, CD_MLOOPUV,  CD_DEFAULT, NULL, dm->numLoopData, uvname);
+
+		BKE_mesh_nurbs_to_mdata_orco(mpolys, totpoly,
+		                             mloops, mloopuvs,
+		                             orco, orco_index);
+	}
+
+	if (orco_index) {
+		MEM_freeN(orco_index);
+	}
+	if (orco) {
+		MEM_freeN(orco);
+	}
+
+	return dm;
+}
+
+DerivedMesh *CDDM_from_curve_displist(Object *ob, ListBase *dispbase, int **orco_index_ptr)
+{
+	const short do_orco_as_uv= 1;
 	DerivedMesh *dm;
 	CDDerivedMesh *cddm;
 	MVert *allvert;
@@ -1723,7 +1764,7 @@
 	int totvert, totedge, totloop, totpoly;
 
 	if (BKE_mesh_nurbs_displist_to_mdata(ob, dispbase, &allvert, &totvert, &alledge,
-	                                     &totedge, &allloop, &allpoly, &totloop, &totpoly) != 0)
+	                                     &totedge, &allloop, &allpoly, &totloop, &totpoly, orco_index_ptr) != 0)
 	{
 		/* Error initializing mdata. This often happens when curve is empty */
 		return CDDM_new(0, 0, 0, 0, 0);
@@ -1746,6 +1787,10 @@
 
 	CDDM_calc_edges(dm);
 
+	if (do_orco_as_uv ) {
+		BKE_curve_make_orco(NULL, ob);
+	}
+
 	return dm;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2012-07-31 13:17:07 UTC (rev 49411)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2012-07-31 13:43:26 UTC (rev 49412)
@@ -948,7 +948,7 @@
 					curve_to_filledpoly(cu, nurb, dispbase);
 				}
 
-				dm = CDDM_from_curve_displist(ob, dispbase);
+				dm = CDDM_from_curve_displist(ob, dispbase, NULL);
 
 				CDDM_calc_normals_mapping(dm);
 			}
@@ -1038,7 +1038,7 @@
 
 	/* OrcoDM should be created from underformed disp lists */
 	BKE_displist_make_curveTypes_forOrco(scene, ob, &disp);
-	dm = CDDM_from_curve_displist(ob, &disp);
+	dm = CDDM_from_curve_displist(ob, &disp, NULL);
 
 	BKE_displist_free(&disp);
 

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-07-31 13:17:07 UTC (rev 49411)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-07-31 13:43:26 UTC (rev 49412)
@@ -394,6 +394,7 @@
 	
 	if (me == NULL) return;
 	
+	if (me->mat)
 	for (a = 0; a < me->totcol; a++) {
 		if (me->mat[a]) me->mat[a]->id.us--;
 		me->mat[a] = NULL;
@@ -1234,19 +1235,21 @@
 	                                        allvert, totvert,
 	                                        alledge, totedge,
 	                                        allloop, allpoly,
-	                                        totloop, totpoly);
+	                                        totloop, totpoly, NULL);
 }
 
 /* BMESH: this doesn't calculate all edges from polygons,
  * only free standing edges are calculated */
 
 /* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */
-/* use specified dispbase  */
+/* use specified dispbase */
+/* TODO: orco values for non DL_SURF types */
 int BKE_mesh_nurbs_displist_to_mdata(Object *ob, ListBase *dispbase,
                                      MVert **allvert, int *_totvert,
                                      MEdge **alledge, int *_totedge,
                                      MLoop **allloop, MPoly **allpoly,
-                                     int *_totloop, int *_totpoly)
+                                     int *_totloop, int *_totpoly,
+                                     int **orco_index_ptr)
 {
 	DispList *dl;
 	Curve *cu;
@@ -1258,6 +1261,7 @@
 	int a, b, ofs, vertcount, startvert, totvert = 0, totedge = 0, totloop = 0, totvlak = 0;
 	int p1, p2, p3, p4, *index;
 	int conv_polys = 0;
+	int (*orco_index)[4] = NULL;
 
 	cu = ob->data;
 
@@ -1308,6 +1312,11 @@
 	/* verts and faces */
 	vertcount = 0;
 
+	if (orco_index_ptr) {
+		*orco_index_ptr = MEM_callocN(sizeof(int) * totvlak * 4, "nurbs_init orco");
+		orco_index = (int (*)[4]) *orco_index_ptr;
+	}
+
 	dl = dispbase->first;
 	while (dl) {
 		int smooth = dl->rt & CU_SMOOTH ? 1 : 0;
@@ -1385,8 +1394,6 @@
 				mloop += 3;
 				index += 3;
 			}
-
-
 		}
 		else if (dl->type == DL_SURF) {
 			startvert = vertcount;
@@ -1431,6 +1438,15 @@
 					mpoly->totloop = 4;
 					mpoly->mat_nr = dl->col;
 
+					if (orco_index) {
+						const int poly_index = mpoly - *allpoly;
+						const int p_orco_base = startvert + ((dl->nr + 1) * a) + b;
+						orco_index[poly_index][0] = p_orco_base + 1;
+						orco_index[poly_index][1] = p_orco_base + dl->nr + 2;
+						orco_index[poly_index][2] = p_orco_base + dl->nr + 1;
+						orco_index[poly_index][3] = p_orco_base;
+					}
+
 					if (smooth) mpoly->flag |= ME_SMOOTH;
 					mpoly++;
 					mloop += 4;
@@ -1461,8 +1477,34 @@
 	return 0;
 }
 
+
+MINLINE void copy_uv_orco_v2_v2(float r[2], const float a[2])
+{
+	r[0] = 0.5f + a[0] * 0.5f;
+	r[1] = 0.5f + a[1] * 0.5f;
+}
+
+/**
+ * orco is normally from #BKE_curve_make_orco
+ */
+void BKE_mesh_nurbs_to_mdata_orco(MPoly *mpoly, int totpoly,
+                                  MLoop *mloops, MLoopUV *mloopuvs,
+                                  float (*orco)[3], int (*orco_index)[4])
+{
+	MPoly *mp;
+
+	int i, j;
+	for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
+		MLoop *ml = mloops + mp->loopstart;
+		MLoopUV *mluv = mloopuvs + mp->loopstart;
+		for (j = 0; j < mp->totloop; j++, ml++, mluv++) {
+			copy_uv_orco_v2_v2(mluv->uv, orco[orco_index[i][j]]);
+		}
+	}
+}
+
 /* this may fail replacing ob->data, be sure to check ob->type */
-void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase)
+void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase, int **orco_index_ptr)
 {
 	Main *bmain = G.main;
 	Object *ob1;
@@ -1480,7 +1522,7 @@
 	if (dm == NULL) {
 		if (BKE_mesh_nurbs_displist_to_mdata(ob, dispbase, &allvert, &totvert,
 		                                     &alledge, &totedge, &allloop,
-		                                     &allpoly, &totloop, &totpoly) != 0)
+		                                     &allpoly, &totloop, &totpoly, orco_index_ptr) != 0)
 		{
 			/* Error initializing */
 			return;
@@ -1536,7 +1578,7 @@
 
 void BKE_mesh_from_nurbs(Object *ob)
 {
-	BKE_mesh_from_nurbs_displist(ob, &ob->disp);
+	BKE_mesh_from_nurbs_displist(ob, &ob->disp, NULL);
 }
 
 typedef struct EdgeLink {

Modified: trunk/blender/source/blender/makesrna/intern/rna_object_api.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list