[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26056] trunk/blender: bugfix [#20639] BF25_SVN_25888 and below - OBJ and 3DS import fails

Campbell Barton ideasman42 at gmail.com
Sun Jan 17 21:06:34 CET 2010


Revision: 26056
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26056
Author:   campbellbarton
Date:     2010-01-17 21:06:34 +0100 (Sun, 17 Jan 2010)

Log Message:
-----------
bugfix [#20639] BF25_SVN_25888 and below - OBJ and 3DS import fails

blender supports type changing for textures in a way that python doesnt.
add a new general function.

Example usage:
 tex = bpy.data.textures.new("Foo")
 tex.type = 'IMAGE'
 tex = tex.recast_type()

Macro to give the number of users accounting for fake user.
 ID_REAL_USERS(id)
Use this so you can remove a datablock if it has a fake users as well as apply transformations to it in the 3D view.

Move api function bpy.data.add_texture() --> bpy.data.textures.new()/remove()

Modified Paths:
--------------
    trunk/blender/release/scripts/io/import_scene_3ds.py
    trunk/blender/release/scripts/io/import_scene_obj.py
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/editors/object/object_transform.c
    trunk/blender/source/blender/makesdna/DNA_ID.h
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c
    trunk/blender/source/blender/makesrna/intern/rna_texture.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/release/scripts/io/import_scene_3ds.py
===================================================================
--- trunk/blender/release/scripts/io/import_scene_3ds.py	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/release/scripts/io/import_scene_3ds.py	2010-01-17 20:06:34 UTC (rev 26056)
@@ -507,8 +507,9 @@
         return [float(col)/255 for col in struct.unpack('<3B', temp_data)] # data [0,1,2] == rgb
 
     def read_texture(new_chunk, temp_chunk, name, mapto):
-        new_texture = bpy.data.add_texture('Diffuse')
+        new_texture = bpy.data.textures.new('Diffuse')
         new_texture.type = 'IMAGE'
+        new_texture = new_texture.recast_type()
 
         img = None
         while (new_chunk.bytes_read < new_chunk.length):

Modified: trunk/blender/release/scripts/io/import_scene_obj.py
===================================================================
--- trunk/blender/release/scripts/io/import_scene_obj.py	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/release/scripts/io/import_scene_obj.py	2010-01-17 20:06:34 UTC (rev 26056)
@@ -367,8 +367,9 @@
     #==================================================================================#
     def load_material_image(blender_material, context_material_name, imagepath, type):
 
-        texture= bpy.data.add_texture(type)
+        texture= bpy.data.textures.new(type)
         texture.type= 'IMAGE'
+        texture = texture.recast_type() # Workaround for limitation in rna api.
 # 		texture= bpy.data.textures.new(type)
 # 		texture.setType('Image')
 

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-17 20:06:34 UTC (rev 26056)
@@ -47,7 +47,7 @@
 int *get_defgroup_flip_map(struct Object *ob);
 int get_named_vertexgroup_num (Object *ob, const char *name);
 void unique_vertexgroup_name (struct bDeformGroup *dg, struct Object *ob);
-void flip_vertexgroup_name (char *name_r, const char *name, int strip_number);
+void flip_vertexgroup_name (char *name, const char *from_name, int strip_number);
 
 float deformvert_get_weight(const struct MDeformVert *dvert, int group_num);
 float vertexgroup_get_vertex_weight(const struct MDeformVert *dvert, int index, int group_num);

Modified: trunk/blender/source/blender/editors/object/object_transform.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_transform.c	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/editors/object/object_transform.c	2010-01-17 20:06:34 UTC (rev 26056)
@@ -411,7 +411,7 @@
 		if(ob->type==OB_MESH) {
 			me= ob->data;
 			
-			if(me->id.us>1) {
+			if(ID_REAL_USERS(me) > 1) {
 				BKE_report(reports, RPT_ERROR, "Can't apply to a multi user mesh, doing nothing.");
 				return OPERATOR_CANCELLED;
 			}
@@ -419,7 +419,7 @@
 		else if(ob->type==OB_ARMATURE) {
 			arm= ob->data;
 			
-			if(arm->id.us>1) {
+			if(ID_REAL_USERS(arm) > 1) {
 				BKE_report(reports, RPT_ERROR, "Can't apply to a multi user armature, doing nothing.");
 				return OPERATOR_CANCELLED;
 			}
@@ -427,7 +427,7 @@
 		else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
 			cu= ob->data;
 			
-			if(cu->id.us>1) {
+			if(ID_REAL_USERS(cu) > 1) {
 				BKE_report(reports, RPT_ERROR, "Can't apply to a multi user curve, doing nothing.");
 				return OPERATOR_CANCELLED;
 			}
@@ -984,7 +984,7 @@
 				
 				if (arm->id.lib) {
 					tot_lib_error++;
-				} else if(arm->id.us>1) {
+				} else if(ID_REAL_USERS(arm) > 1) {
 					/*BKE_report(op->reports, RPT_ERROR, "Can't apply to a multi user armature");
 					return;*/
 					tot_multiuser_arm_error++;

Modified: trunk/blender/source/blender/makesdna/DNA_ID.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_ID.h	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/makesdna/DNA_ID.h	2010-01-17 20:06:34 UTC (rev 26056)
@@ -198,6 +198,8 @@
 			/* fluidsim Ipo */
 #define ID_FLUIDSIM	MAKE_ID2('F', 'S')
 
+#define ID_REAL_USERS(id) (((ID *)id)->us - ((((ID *)id)->flag & LIB_FAKEUSER) ? 1:0))
+
 /* id->flag: set frist 8 bits always at zero while reading */
 #define LIB_LOCAL		0
 #define LIB_EXTERN		1

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2010-01-17 20:06:34 UTC (rev 26056)
@@ -569,6 +569,7 @@
 void RNA_pointer_create(struct ID *id, StructRNA *type, void *data, PointerRNA *r_ptr);
 
 void RNA_blender_rna_pointer_create(PointerRNA *r_ptr);
+void RNA_pointer_recast(PointerRNA *ptr, PointerRNA *r_ptr);
 
 extern PointerRNA PointerRNA_NULL;
 

Modified: trunk/blender/source/blender/makesrna/RNA_enum_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_enum_types.h	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/makesrna/RNA_enum_types.h	2010-01-17 20:06:34 UTC (rev 26056)
@@ -64,6 +64,8 @@
 
 extern EnumPropertyItem brush_sculpt_tool_items[];
 
+extern EnumPropertyItem texture_type_items[];
+
 extern EnumPropertyItem unpack_method_items[];
 
 extern EnumPropertyItem object_type_items[];

Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/makesrna/RNA_types.h	2010-01-17 20:06:34 UTC (rev 26056)
@@ -335,6 +335,7 @@
 #define MainTexts Main
 #define MainActions Main
 #define MainGroups Main
+#define MainTextures Main
 
 #ifdef __cplusplus
 }

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-01-17 20:06:34 UTC (rev 26056)
@@ -191,6 +191,30 @@
 	return result;
 }
 
+/**/
+void RNA_pointer_recast(PointerRNA *ptr, PointerRNA *r_ptr)
+{
+#if 0 // works but this case if covered by more general code below.
+	if(RNA_struct_is_ID(ptr->type)) {
+		/* simple case */
+		RNA_id_pointer_create(ptr->id.data, r_ptr);
+	}
+	else
+#endif
+	{
+		StructRNA *base;
+		PointerRNA t_ptr;
+		*r_ptr= *ptr; /* initialize as the same incase cant recast */
+
+		for(base=ptr->type->base; base; base=base->base) {
+			t_ptr= rna_pointer_inherit_refine(ptr, base, ptr->data);
+			if(t_ptr.type && t_ptr.type != ptr->type) {
+				*r_ptr= t_ptr;
+			}
+		}
+	}
+}
+
 /* ID Properties */
 
 /* return a UI local ID prop definition for this prop */

Modified: trunk/blender/source/blender/makesrna/intern/rna_main_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2010-01-17 19:34:01 UTC (rev 26055)
+++ trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2010-01-17 20:06:34 UTC (rev 26056)
@@ -57,6 +57,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_object_types.h"
 #include "DNA_text_types.h"
+#include "DNA_texture_types.h"
 #include "DNA_group_types.h"
 
 #include "ED_screen.h"
@@ -66,8 +67,6 @@
 	return add_texture(name);
 }
 
-/* TODO: remove texture? */
-
 Image *rna_Main_add_image(Main *bmain, char *filename)
 {
 	return BKE_add_image_file(filename, 0);
@@ -79,10 +78,10 @@
 }
 void rna_Main_cameras_remove(Main *bmain, ReportList *reports, struct Camera *camera)
 {
-	if(camera->id.us == 0)
+	if(ID_REAL_USERS(camera) == 0)
 		free_libblock(&bmain->camera, camera);
 	else
-		BKE_reportf(reports, RPT_ERROR, "Camera \"%s\" must have zero users to be removed, found %d.", camera->id.name+2, camera->id.us);
+		BKE_reportf(reports, RPT_ERROR, "Camera \"%s\" must have zero users to be removed, found %d.", camera->id.name+2, ID_REAL_USERS(camera));
 
 	/* XXX python now has invalid pointer? */
 }
@@ -130,10 +129,10 @@
 	  # don't do this since ob is already freed!
 	  bpy.data.remove_object(ob)
 	*/
-	if(object->id.us == 0)
+	if(ID_REAL_USERS(object) == 0)
 		free_libblock(&bmain->object, object);
 	else
-		BKE_reportf(reports, RPT_ERROR, "Object \"%s\" must have zero users to be removed, found %d.", object->id.name+2, object->id.us);
+		BKE_reportf(reports, RPT_ERROR, "Object \"%s\" must have zero users to be removed, found %d.", object->id.name+2, ID_REAL_USERS(object));
 }
 
 struct Material *rna_Main_materials_new(Main *bmain, char* name)
@@ -142,10 +141,10 @@
 }
 void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material *material)
 {
-	if(material->id.us == 0)
+	if(ID_REAL_USERS(material) == 0)
 		free_libblock(&bmain->mat, material);
 	else
-		BKE_reportf(reports, RPT_ERROR, "Material \"%s\" must have zero users to be removed, found %d.", material->id.name+2, material->id.us);
+		BKE_reportf(reports, RPT_ERROR, "Material \"%s\" must have zero users to be removed, found %d.", material->id.name+2, ID_REAL_USERS(material));
 
 	/* XXX python now has invalid pointer? */
 }
@@ -158,10 +157,10 @@
 }
 void rna_Main_meshes_remove(Main *bmain, ReportList *reports, Mesh *mesh)
 {
-	if(mesh->id.us == 0)
+	if(ID_REAL_USERS(mesh) == 0)
 		free_libblock(&bmain->mesh, mesh);
 	else
-		BKE_reportf(reports, RPT_ERROR, "Mesh \"%s\" must have zero users to be removed, found %d.", mesh->id.name+2, mesh->id.us);
+		BKE_reportf(reports, RPT_ERROR, "Mesh \"%s\" must have zero users to be removed, found %d.", mesh->id.name+2, ID_REAL_USERS(mesh));
 
 	/* XXX python now has invalid pointer? */
 }
@@ -174,14 +173,28 @@
 }
 void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp)
 {
-	if(lamp->id.us == 0)
+	if(ID_REAL_USERS(lamp) == 0)
 		free_libblock(&bmain->lamp, lamp);
 	else
-		BKE_reportf(reports, RPT_ERROR, "Lamp \"%s\" must have zero users to be removed, found %d.", lamp->id.name+2, lamp->id.us);
+		BKE_reportf(reports, RPT_ERROR, "Lamp \"%s\" must have zero users to be removed, found %d.", lamp->id.name+2, ID_REAL_USERS(lamp));
 
 	/* XXX python now has invalid pointer? */
 }
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list