[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56500] trunk/blender: Fix #35209: cycles generated texture coordinates did not stick to deforming meshes.

Brecht Van Lommel brechtvanlommel at pandora.be
Sun May 5 07:56:41 CEST 2013


Revision: 56500
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56500
Author:   blendix
Date:     2013-05-05 05:56:41 +0000 (Sun, 05 May 2013)
Log Message:
-----------
Fix #35209: cycles generated texture coordinates did not stick to deforming meshes.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/blender/blender_util.h
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/collada/collada_utils.cpp
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/makesrna/intern/rna_internal.h
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c
    trunk/blender/source/blender/makesrna/intern/rna_texture.c
    trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-05-05 05:56:41 UTC (rev 56500)
@@ -336,7 +336,7 @@
 		size_t i = 0;
 
 		for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
-			generated[i++] = get_float3(v->co())*size - loc;
+			generated[i++] = get_float3(v->undeformed_co())*size - loc;
 	}
 }
 
@@ -435,7 +435,8 @@
 	mesh_synced.insert(mesh);
 
 	/* create derived mesh */
-	BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview);
+	bool need_undeformed = mesh->need_attribute(scene, ATTR_STD_GENERATED);
+	BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, need_undeformed);
 	PointerRNA cmesh = RNA_pointer_get(&b_ob_data.ptr, "cycles");
 
 	vector<Mesh::Triangle> oldtriangle = mesh->triangles;
@@ -507,7 +508,7 @@
 		return;
 
 	/* get derived mesh */
-	BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview);
+	BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, false);
 
 	if(b_mesh) {
 		BL::Mesh::vertices_iterator v;

Modified: trunk/blender/intern/cycles/blender/blender_util.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_util.h	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/intern/cycles/blender/blender_util.h	2013-05-05 05:56:41 UTC (rev 56500)
@@ -39,9 +39,9 @@
 
 CCL_NAMESPACE_BEGIN
 
-static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render)
+static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render, bool calc_undeformed)
 {
-	return data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1, true);
+	return data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1, true, calc_undeformed);
 }
 
 static inline void colorramp_to_array(BL::ColorRamp ramp, float4 *data, int size)

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-05-05 05:56:41 UTC (rev 56500)
@@ -468,7 +468,7 @@
 
 /** utility function to convert a DerivedMesh to a Mesh
  */
-void DM_to_mesh(DerivedMesh *dm, struct Mesh *me, struct Object *ob);
+void DM_to_mesh(DerivedMesh *dm, struct Mesh *me, struct Object *ob, CustomDataMask mask);
 
 struct BMEditMesh *DM_to_editbmesh(struct DerivedMesh *dm,
                                    struct BMEditMesh *existing, int do_tessellate);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-05-05 05:56:41 UTC (rev 56500)
@@ -470,7 +470,7 @@
 	dm->dirty &= ~DM_DIRTY_TESS_CDLAYERS;
 }
 
-void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob)
+void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, CustomDataMask mask)
 {
 	/* dm might depend on me, so we need to do everything with a local copy */
 	Mesh tmp = *me;
@@ -489,10 +489,10 @@
 	totpoly = tmp.totpoly = dm->getNumPolys(dm);
 	tmp.totface = 0;
 
-	CustomData_copy(&dm->vertData, &tmp.vdata, CD_MASK_MESH, CD_DUPLICATE, totvert);
-	CustomData_copy(&dm->edgeData, &tmp.edata, CD_MASK_MESH, CD_DUPLICATE, totedge);
-	CustomData_copy(&dm->loopData, &tmp.ldata, CD_MASK_MESH, CD_DUPLICATE, totloop);
-	CustomData_copy(&dm->polyData, &tmp.pdata, CD_MASK_MESH, CD_DUPLICATE, totpoly);
+	CustomData_copy(&dm->vertData, &tmp.vdata, mask, CD_DUPLICATE, totvert);
+	CustomData_copy(&dm->edgeData, &tmp.edata, mask, CD_DUPLICATE, totedge);
+	CustomData_copy(&dm->loopData, &tmp.ldata, mask, CD_DUPLICATE, totloop);
+	CustomData_copy(&dm->polyData, &tmp.pdata, mask, CD_DUPLICATE, totpoly);
 	tmp.cd_flag = dm->cd_flag;
 
 	if (CustomData_has_layer(&dm->vertData, CD_SHAPEKEY)) {

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-05-05 05:56:41 UTC (rev 56500)
@@ -1599,7 +1599,7 @@
 	}
 	else {
 		me = BKE_mesh_add(G.main, "Mesh");
-		DM_to_mesh(dm, me, ob);
+		DM_to_mesh(dm, me, ob, CD_MASK_MESH);
 	}
 
 	me->totcol = cu->totcol;

Modified: trunk/blender/source/blender/collada/collada_utils.cpp
===================================================================
--- trunk/blender/source/blender/collada/collada_utils.cpp	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/collada/collada_utils.cpp	2013-05-05 05:56:41 UTC (rev 56500)
@@ -160,7 +160,7 @@
 	}
 
 	tmpmesh = BKE_mesh_add(G.main, "ColladaMesh"); // name is not important here
-	DM_to_mesh(dm, tmpmesh, ob);
+	DM_to_mesh(dm, tmpmesh, ob, CD_MASK_MESH);
 	dm->release(dm);
 
 	if (triangulate) {

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/editors/object/object_add.c	2013-05-05 05:56:41 UTC (rev 56500)
@@ -1528,7 +1528,7 @@
 			dm = mesh_get_derived_final(scene, newob, CD_MASK_MESH);
 			// dm = mesh_create_derived_no_deform(ob1, NULL);  /* this was called original (instead of get_derived). man o man why! (ton) */
 
-			DM_to_mesh(dm, newob->data, newob);
+			DM_to_mesh(dm, newob->data, newob, CD_MASK_MESH);
 
 			/* re-tessellation is called by DM_to_mesh */
 

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2013-05-05 05:56:41 UTC (rev 56500)
@@ -616,7 +616,7 @@
 				return 0;
 			}
 
-			DM_to_mesh(dm, me, ob);
+			DM_to_mesh(dm, me, ob, CD_MASK_MESH);
 
 			dm->release(dm);
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_internal.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_internal.h	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/makesrna/intern/rna_internal.h	2013-05-05 05:56:41 UTC (rev 56500)
@@ -405,7 +405,7 @@
 
 struct Mesh *rna_Main_meshes_new_from_object(
         struct Main *bmain, struct ReportList *reports, struct Scene *sce,
-        struct Object *ob, int apply_modifiers, int settings, int calc_tessface);
+        struct Object *ob, int apply_modifiers, int settings, int calc_tessface, int calc_undeformed);
 
 /* XXX, these should not need to be defined here~! */
 struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports);

Modified: trunk/blender/source/blender/makesrna/intern/rna_main_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2013-05-05 05:56:41 UTC (rev 56500)
@@ -276,7 +276,7 @@
 /* settings: 1 - preview, 2 - render */
 Mesh *rna_Main_meshes_new_from_object(
         Main *bmain, ReportList *reports, Scene *sce,
-        Object *ob, int apply_modifiers, int settings, int calc_tessface)
+        Object *ob, int apply_modifiers, int settings, int calc_tessface, int calc_undeformed)
 {
 	Mesh *tmpmesh;
 	Curve *tmpcu = NULL, *copycu;
@@ -379,6 +379,9 @@
 				CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
 			                                         * for example, needs CD_MASK_MDEFORMVERT */
 
+				if (calc_undeformed)
+					mask |= CD_MASK_ORCO;
+
 				/* Write the display mesh into the dummy mesh */
 				if (render)
 					dm = mesh_create_derived_render(sce, ob, mask);
@@ -386,7 +389,7 @@
 					dm = mesh_create_derived_view(sce, ob, mask);
 
 				tmpmesh = BKE_mesh_add(bmain, "Mesh");
-				DM_to_mesh(dm, tmpmesh, ob);
+				DM_to_mesh(dm, tmpmesh, ob, mask);
 				dm->release(dm);
 			}
 
@@ -1172,6 +1175,7 @@
 	parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 	RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
+	RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
 	parm = RNA_def_pointer(func, "mesh", "Mesh", "",
 	                       "Mesh created from object, remove it if it is only used for export");
 	RNA_def_function_return(func, parm);

Modified: trunk/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2013-05-05 05:54:29 UTC (rev 56499)
+++ trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2013-05-05 05:56:41 UTC (rev 56500)
@@ -591,6 +591,23 @@
 		rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL);
 }
 
+static void rna_MeshVertex_undeformed_co_get(PointerRNA *ptr, float values[3])
+{
+	Mesh *me = rna_mesh(ptr);
+	MVert *mvert = (MVert *)ptr->data;
+	float (*orco)[3] =  CustomData_get_layer(&me->vdata, CD_ORCO);
+
+	if (orco) {
+		/* orco is normalized to 0..1, we do inverse to match mvert->co */
+		float loc[3], size[3];
+
+		BKE_mesh_texspace_get(me->texcomesh ? me->texcomesh : me, loc, NULL, size);
+		madd_v3_v3v3v3(values, loc, orco[(mvert - me->mvert)], size);
+	}
+	else
+		copy_v3_v3(values, mvert->co);
+}
+
 static int rna_CustomDataLayer_active_get(PointerRNA *ptr, CustomData *data, int type, int render)
 {
 	int n = ((CustomDataLayer *)ptr->data) - data->layers;
@@ -1638,6 +1655,12 @@
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list