Merged changes in the trunk up to revision 32124.
[blender-staging.git] / source / blender / makesrna / intern / rna_main_api.c
index 9e8f60af439e03c874e2f98293ca4717732c4893..bb35673e3883415c6bb4e12e4304dcb16548461f 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <errno.h>
 
 #include "RNA_define.h"
 #include "RNA_access.h"
@@ -86,7 +87,9 @@ Tex *rna_Main_add_texture(Main *bmain, char *name)
 
 Camera *rna_Main_cameras_new(Main *bmain, char* name)
 {
-       return add_camera(name);
+       ID *id= add_camera(name);
+       id->us--;
+       return (Camera *)id;
 }
 void rna_Main_cameras_remove(Main *bmain, ReportList *reports, struct Camera *camera)
 {
@@ -173,27 +176,20 @@ Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *d
 
 void rna_Main_objects_remove(Main *bmain, ReportList *reports, struct Object *object)
 {
-       /*
-         NOTE: the following example shows when this function should _not_ be called
-
-         ob = bpy.data.add_object()
-         scene.add_object(ob)
-
-         # ob is freed here
-         scene.remove_object(ob)
-
-         # don't do this since ob is already freed!
-         bpy.data.remove_object(ob)
-       */
-       if(ID_REAL_USERS(object) <= 0)
+       if(ID_REAL_USERS(object) <= 0) {
+               unlink_object(NULL, object); /* needed or ID pointers to this are not cleared */
                free_libblock(&bmain->object, object);
-       else
+       }
+       else {
                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)
 {
-       return add_material(name);
+       ID *id= (ID *)add_material(name);
+       id->us--;
+       return (Material *)id;
 }
 void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material *material)
 {
@@ -254,16 +250,24 @@ void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp)
        /* XXX python now has invalid pointer? */
 }
 
-Image *rna_Main_images_new(Main *bmain, char* name, int width, int height, int float_buffer)
+Image *rna_Main_images_new(Main *bmain, char* name, int width, int height, int alpha, int float_buffer)
 {
        float color[4]= {0.0, 0.0, 0.0, 1.0};
-       Image *image= BKE_add_image_size(width, height, name, float_buffer, 0, color);
+       Image *image= BKE_add_image_size(width, height, name, alpha ? 32:24, float_buffer, 0, color);
        image->id.us--;
        return image;
 }
-Image *rna_Main_images_load(Main *bmain, char *filepath)
+Image *rna_Main_images_load(Main *bmain, ReportList *reports, char *filepath)
 {
-       return BKE_add_image_file(filepath, 0);
+       Image *ima;
+
+       errno= 0;
+       ima= BKE_add_image_file(filepath, 0);
+
+       if(!ima)
+               BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unsupported image format");
+
+       return ima;
 }
 void rna_Main_images_remove(Main *bmain, ReportList *reports, Image *image)
 {
@@ -317,9 +321,18 @@ void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, struct MetaBall
                BKE_reportf(reports, RPT_ERROR, "MetaBall \"%s\" must have zero users to be removed, found %d.", mb->id.name+2, ID_REAL_USERS(mb));
 }
 
-VFont *rna_Main_fonts_load(Main *bmain, char *filepath)
+VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, char *filepath)
 {
-       return load_vfont(filepath);
+       VFont *font;
+
+       errno= 0;
+       font= load_vfont(filepath);
+
+       if(!font)
+               BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unsupported font format");
+
+       return font;
+
 }
 void rna_Main_fonts_remove(Main *bmain, ReportList *reports, VFont *vfont)
 {
@@ -331,9 +344,10 @@ void rna_Main_fonts_remove(Main *bmain, ReportList *reports, VFont *vfont)
        /* XXX python now has invalid pointer? */
 }
 
-Tex *rna_Main_textures_new(Main *bmain, char* name)
+Tex *rna_Main_textures_new(Main *bmain, char* name, int type)
 {
        Tex *tex= add_texture(name);
+       tex_set_type(tex, type);
        tex->id.us--;
        return tex;
 }
@@ -380,7 +394,6 @@ Group *rna_Main_groups_new(Main *bmain, char* name)
 void rna_Main_groups_remove(Main *bmain, ReportList *reports, Group *group)
 {
        unlink_group(group);
-       group->id.us= 0;
        free_libblock(&bmain->group, group);
        /* XXX python now has invalid pointer? */
 }
@@ -395,11 +408,16 @@ void rna_Main_texts_remove(Main *bmain, ReportList *reports, Text *text)
        free_libblock(&bmain->text, text);
        /* XXX python now has invalid pointer? */
 }
-Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* path)
+
+Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* filepath)
 {
-       Text *txt= add_text(path, bmain->name);
-       if(txt==NULL)
-               BKE_reportf(reports, RPT_ERROR, "Couldn't load text from path \"%s\".", path);
+       Text *txt;
+
+       errno= 0;
+       txt= add_text(filepath, bmain->name);
+
+       if(!txt)
+               BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unable to load text");
 
        return txt;
 }
@@ -512,7 +530,7 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a camera from the current blendfile.");
        parm= RNA_def_pointer(func, "camera", "Camera", "", "Camera to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
@@ -535,10 +553,9 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
 
        func= RNA_def_function(srna, "remove", "rna_Main_scenes_remove");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
-       parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
        RNA_def_function_ui_description(func, "Remove a scene from the current blendfile.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to remove.");
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
@@ -564,10 +581,10 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_return(func, parm);
 
        func= RNA_def_function(srna, "remove", "rna_Main_objects_remove");
+       RNA_def_function_ui_description(func, "Remove a object from the current blendfile.");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       RNA_def_function_ui_description(func, "Remove a object from the current blendfile.");
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
@@ -592,7 +609,7 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a material from the current blendfile.");
        parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -623,7 +640,7 @@ void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a node tree from the current blendfile.");
        parm= RNA_def_pointer(func, "tree", "NodeTree", "", "Node tree to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 #endif
 }
 void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
@@ -648,7 +665,7 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a mesh from the current blendfile.");
        parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -672,7 +689,7 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a lamp from the current blendfile.");
        parm= RNA_def_pointer(func, "lamp", "Lamp", "", "Lamp to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -702,12 +719,14 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm= RNA_def_int(func, "width", 1024, 1, INT_MAX, "", "Width of the image.", 0, INT_MAX);
        parm= RNA_def_int(func, "height", 1024, 1, INT_MAX, "", "Height of the image.", 0, INT_MAX);
+       parm= RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
        parm= RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
        /* return type */
        parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock.");
        RNA_def_function_return(func, parm);
 
        func= RNA_def_function(srna, "load", "rna_Main_images_load");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Load a new image into the main database");
        parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the file to load.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -719,7 +738,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove an image from the current blendfile.");
        parm= RNA_def_pointer(func, "image", "Image", "", "Image to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
@@ -744,7 +763,7 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a lattice from the current blendfile.");
        parm= RNA_def_pointer(func, "lattice", "Lattice", "", "Lattice to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -760,7 +779,7 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Add a new curve to the main database");
        parm= RNA_def_string(func, "name", "Curve", 0, "", "New name for the datablock.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_enum(func, "type", object_type_curve_items, 0, "Type", "The type of curve object to add");
+       parm= RNA_def_enum(func, "type", object_type_curve_items, 0, "Type", "The type of curve to add");
        RNA_def_property_flag(parm, PROP_REQUIRED);
        /* return type */
        parm= RNA_def_pointer(func, "curve", "Curve", "", "New curve datablock.");
@@ -770,7 +789,7 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a curve from the current blendfile.");
        parm= RNA_def_pointer(func, "curve", "Curve", "", "Curve to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -794,7 +813,7 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a metaball from the current blendfile.");
        parm= RNA_def_pointer(func, "metaball", "MetaBall", "", "MetaBall to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -807,6 +826,7 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_struct_ui_text(srna, "Main Fonts", "Collection of fonts");
 
        func= RNA_def_function(srna, "load", "rna_Main_fonts_load");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Load a new font into the main database");
        parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the font to load.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -818,7 +838,7 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a font from the current blendfile.");
        parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "Font to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -834,6 +854,8 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Add a new texture to the main database");
        parm= RNA_def_string(func, "name", "Texture", 0, "", "New name for the datablock.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm= RNA_def_enum(func, "type", texture_type_items, 0, "Type", "The type of texture to add");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
        /* return type */
        parm= RNA_def_pointer(func, "texture", "Texture", "", "New texture datablock.");
        RNA_def_function_return(func, parm);
@@ -842,7 +864,7 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a texture from the current blendfile.");
        parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -866,7 +888,7 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a brush from the current blendfile.");
        parm= RNA_def_pointer(func, "brush", "Brush", "", "Brush to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
@@ -891,7 +913,7 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a world from the current blendfile.");
        parm= RNA_def_pointer(func, "world", "World", "", "World to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
@@ -916,7 +938,7 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a group from the current blendfile.");
        parm= RNA_def_pointer(func, "group", "Group", "", "Group to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -940,7 +962,7 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a text from the current blendfile.");
        parm= RNA_def_pointer(func, "text", "Text", "", "Text to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 
        /* load func */
        func= RNA_def_function(srna, "load", "rna_Main_texts_load");
@@ -978,7 +1000,7 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a armature from the current blendfile.");
        parm= RNA_def_pointer(func, "armature", "Armature", "", "Armature to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -1002,7 +1024,7 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a action from the current blendfile.");
        parm= RNA_def_pointer(func, "action", "Action", "", "Action to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
 {
@@ -1026,7 +1048,7 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a particle settings instance from the current blendfile.");
        parm= RNA_def_pointer(func, "particle", "ParticleSettings", "", "Particle Settings to remove.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
 {