[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47566] trunk/blender/source/blender: Fix #31725: UV map order is ignored when opening in 2.6+ versions

Sergey Sharybin sergey.vfx at gmail.com
Thu Jun 7 11:11:24 CEST 2012


Revision: 47566
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47566
Author:   nazgul
Date:     2012-06-07 09:11:16 +0000 (Thu, 07 Jun 2012)
Log Message:
-----------
Fix #31725: UV map order is ignored when opening in 2.6+ versions

Issue was caused by do_versions being used pdata as reference for active/render/
stencil/clone layer indices instead of fdata.

Added some utility functions used only by do_versions to be sure this indices
are set from fdata for pre-bmesh files.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_customdata.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_customdata.h	2012-06-07 09:05:51 UTC (rev 47565)
+++ trunk/blender/source/blender/blenkernel/BKE_customdata.h	2012-06-07 09:11:16 UTC (rev 47566)
@@ -321,6 +321,7 @@
                              struct CustomData *ldata, int totloop, int totpoly);
 void CustomData_from_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata, int total);
 void CustomData_bmesh_update_active_layers(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
+void CustomData_bmesh_do_versions_update_active_layers(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
 void CustomData_bmesh_init_pool(struct CustomData *data, int totelem, const char htype);
 
 /* External file storage */

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-06-07 09:05:51 UTC (rev 47565)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-06-07 09:11:16 UTC (rev 47566)
@@ -151,6 +151,7 @@
 void BKE_mesh_delete_material_index(struct Mesh *me, short index);
 void BKE_mesh_smooth_flag_set(struct Object *meshOb, int enableSmooth);
 void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh);
+void BKE_mesh_do_versions_convert_mfaces_to_mpolys(struct Mesh *mesh);
 void BKE_mesh_convert_mfaces_to_mpolys_ex(struct ID *id,
                                           struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata,
                                           int totedge_i, int totface_i, int totloop_i, int totpoly_i,

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-06-07 09:05:51 UTC (rev 47565)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-06-07 09:11:16 UTC (rev 47566)
@@ -2219,6 +2219,48 @@
 	}
 }
 
+/* update active indices for active/render/clone/stencil custom data layers
+ * based on indices from fdata layers
+ * used by do_versions in readfile.c when creating pdata and ldata for pre-bmesh
+ * meshes and needed to preserve active/render/clone/stencil flags set in pre-bmesh files
+ */
+void CustomData_bmesh_do_versions_update_active_layers(CustomData *fdata, CustomData *pdata, CustomData *ldata)
+{
+	int act;
+
+	if (CustomData_has_layer(fdata, CD_MTFACE)) {
+		act = CustomData_get_active_layer(fdata, CD_MTFACE);
+		CustomData_set_layer_active(pdata, CD_MTEXPOLY, act);
+		CustomData_set_layer_active(ldata, CD_MLOOPUV, act);
+
+		act = CustomData_get_render_layer(fdata, CD_MTFACE);
+		CustomData_set_layer_render(pdata, CD_MTEXPOLY, act);
+		CustomData_set_layer_render(ldata, CD_MLOOPUV, act);
+
+		act = CustomData_get_clone_layer(fdata, CD_MTFACE);
+		CustomData_set_layer_clone(pdata, CD_MTEXPOLY, act);
+		CustomData_set_layer_clone(ldata, CD_MLOOPUV, act);
+
+		act = CustomData_get_stencil_layer(fdata, CD_MTFACE);
+		CustomData_set_layer_stencil(pdata, CD_MTEXPOLY, act);
+		CustomData_set_layer_stencil(ldata, CD_MLOOPUV, act);
+	}
+
+	if (CustomData_has_layer(fdata, CD_MCOL)) {
+		act = CustomData_get_active_layer(fdata, CD_MCOL);
+		CustomData_set_layer_active(ldata, CD_MLOOPCOL, act);
+
+		act = CustomData_get_render_layer(fdata, CD_MCOL);
+		CustomData_set_layer_render(ldata, CD_MLOOPCOL, act);
+
+		act = CustomData_get_clone_layer(fdata, CD_MCOL);
+		CustomData_set_layer_clone(ldata, CD_MLOOPCOL, act);
+
+		act = CustomData_get_stencil_layer(fdata, CD_MCOL);
+		CustomData_set_layer_stencil(ldata, CD_MLOOPCOL, act);
+	}
+}
+
 void CustomData_bmesh_init_pool(CustomData *data, int totelem, const char htype)
 {
 	int chunksize;

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-06-07 09:05:51 UTC (rev 47565)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-06-07 09:11:16 UTC (rev 47566)
@@ -2038,6 +2038,28 @@
 	mesh_update_customdata_pointers(mesh, TRUE);
 }
 
+/* the same as BKE_mesh_convert_mfaces_to_mpolys but oriented to be used in do_versions from readfile.c
+ * the difference is how active/render/clone/stencil indices are handled here
+ *
+ * normally thay're being set from pdata which totally makes sense for meshes which are already
+ * converted to bmesh structures, but when loading older files indices shall be updated in other
+ * way around, so newly added pdata and ldata would have this indices set based on fdata layer
+ *
+ * this is normally only needed when reading older files, in all other cases BKE_mesh_convert_mfaces_to_mpolys
+ * shall be always used
+ */
+void BKE_mesh_do_versions_convert_mfaces_to_mpolys(Mesh *mesh)
+{
+	BKE_mesh_convert_mfaces_to_mpolys_ex(&mesh->id, &mesh->fdata, &mesh->ldata, &mesh->pdata,
+	                                     mesh->totedge, mesh->totface, mesh->totloop, mesh->totpoly,
+	                                     mesh->medge, mesh->mface,
+	                                     &mesh->totloop, &mesh->totpoly, &mesh->mloop, &mesh->mpoly);
+
+	CustomData_bmesh_do_versions_update_active_layers(&mesh->fdata, &mesh->pdata, &mesh->ldata);
+
+	mesh_update_customdata_pointers(mesh, TRUE);
+}
+
 void BKE_mesh_convert_mfaces_to_mpolys_ex(ID *id, CustomData *fdata, CustomData *ldata, CustomData *pdata,
                                           int totedge_i, int totface_i, int totloop_i, int totpoly_i,
                                           MEdge *medge, MFace *mface,

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-06-07 09:05:51 UTC (rev 47565)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-06-07 09:11:16 UTC (rev 47566)
@@ -3684,7 +3684,7 @@
 				Main *gmain = G.main;
 				G.main = main;
 				
-				BKE_mesh_convert_mfaces_to_mpolys(me);
+				BKE_mesh_do_versions_convert_mfaces_to_mpolys(me);
 				
 				G.main = gmain;
 			}




More information about the Bf-blender-cvs mailing list