[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