Revert to master - those changes are globally valid, but remain incomplete,
[blender.git] / source / blender / makesrna / intern / rna_main_api.c
index 8aa447f523e6e9f802625b97bce527f23bc6747d..5a0da0b76517fa9c2ac9f010d1c27c908703fabb 100644 (file)
@@ -35,6 +35,8 @@
 
 #include "DNA_ID.h"
 #include "DNA_modifier_types.h"
+#include "DNA_space_types.h"
+#include "DNA_object_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_path_util.h"
 #include "BKE_library.h"
 #include "BKE_object.h"
 #include "BKE_material.h"
+#include "BKE_icons.h"
 #include "BKE_image.h"
 #include "BKE_texture.h"
 #include "BKE_scene.h"
+#include "BKE_sound.h"
 #include "BKE_text.h"
 #include "BKE_action.h"
 #include "BKE_group.h"
@@ -69,6 +73,7 @@
 #include "BKE_mball.h"
 #include "BKE_world.h"
 #include "BKE_particle.h"
+#include "BKE_paint.h"
 #include "BKE_font.h"
 #include "BKE_node.h"
 #include "BKE_depsgraph.h"
@@ -84,8 +89,8 @@
 #include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
-#include "DNA_object_types.h"
 #include "DNA_speaker_types.h"
+#include "DNA_sound_types.h"
 #include "DNA_text_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_group_types.h"
 
 #include "ED_screen.h"
 
-#include "BLF_translation.h"
+#include "BLT_translation.h"
 
 #ifdef WITH_PYTHON
 #  include "BPY_extern.h"
@@ -340,19 +345,24 @@ static void rna_Main_lamps_remove(Main *bmain, ReportList *reports, PointerRNA *
        }
 }
 
-static Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer)
+static Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer, int stereo3d)
 {
        float color[4] = {0.0, 0.0, 0.0, 1.0};
-       Image *image = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, float_buffer, 0, color);
+       Image *image = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, float_buffer, 0, color, stereo3d);
        id_us_min(&image->id);
        return image;
 }
-static Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char *filepath)
+static Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char *filepath, int check_existing)
 {
        Image *ima;
 
        errno = 0;
-       ima = BKE_image_load(bmain, filepath);
+       if (check_existing) {
+               ima = BKE_image_load_exists(filepath);
+       }
+       else {
+               ima = BKE_image_load(bmain, filepath);
+       }
 
        if (!ima) {
                BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
@@ -431,12 +441,17 @@ static void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, PointerR
        }
 }
 
-static VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, const char *filepath)
+static VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, const char *filepath, int check_existing)
 {
        VFont *font;
-
        errno = 0;
-       font = BKE_vfont_load(bmain, filepath);
+
+       if (check_existing) {
+               font = BKE_vfont_load_exists(bmain, filepath);
+       }
+       else {
+               font = BKE_vfont_load(bmain, filepath);
+       }
 
        if (!font)
                BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
@@ -460,8 +475,8 @@ static void rna_Main_fonts_remove(Main *bmain, ReportList *reports, PointerRNA *
 
 static Tex *rna_Main_textures_new(Main *bmain, const char *name, int type)
 {
-       Tex *tex = add_texture(bmain, name);
-       tex_set_type(tex, type);
+       Tex *tex = BKE_texture_add(bmain, name);
+       BKE_texture_type_set(tex, type);
        id_us_min(&tex->id);
        return tex;
 }
@@ -478,12 +493,13 @@ static void rna_Main_textures_remove(Main *bmain, ReportList *reports, PointerRN
        }
 }
 
-static Brush *rna_Main_brushes_new(Main *bmain, const char *name)
+static Brush *rna_Main_brushes_new(Main *bmain, const char *name, int mode)
 {
-       Brush *brush = BKE_brush_add(bmain, name);
+       Brush *brush = BKE_brush_add(bmain, name, mode);
        id_us_min(&brush->id);
        return brush;
 }
+
 static void rna_Main_brushes_remove(Main *bmain, ReportList *reports, PointerRNA *brush_ptr)
 {
        Brush *brush = brush_ptr->data;
@@ -547,6 +563,33 @@ static void rna_Main_speakers_remove(Main *bmain, ReportList *reports, PointerRN
        }
 }
 
+static bSound *rna_Main_sounds_load(Main *bmain, const char *name, int check_existing)
+{
+       bSound *sound;
+
+       if (check_existing) {
+               sound = BKE_sound_new_file_exists(bmain, name);
+       }
+       else {
+               sound = BKE_sound_new_file(bmain, name);
+       }
+
+       id_us_min(&sound->id);
+       return sound;
+}
+static void rna_Main_sounds_remove(Main *bmain, ReportList *reports, PointerRNA *sound_ptr)
+{
+       Speaker *sound = sound_ptr->data;
+       if (ID_REAL_USERS(sound) <= 0) {
+               BKE_libblock_free(bmain, sound);
+               RNA_POINTER_INVALIDATE(sound_ptr);
+       }
+       else {
+               BKE_reportf(reports, RPT_ERROR, "Sound '%s' must have zero users to be removed, found %d",
+                           sound->id.name + 2, ID_REAL_USERS(sound));
+       }
+}
+
 static Text *rna_Main_texts_new(Main *bmain, const char *name)
 {
        return BKE_text_add(bmain, name);
@@ -631,12 +674,37 @@ static void rna_Main_particles_remove(Main *bmain, ReportList *reports, PointerR
        }
 }
 
-static MovieClip *rna_Main_movieclip_load(Main *bmain, ReportList *reports, const char *filepath)
+static Palette *rna_Main_palettes_new(Main *bmain, const char *name)
+{
+       Palette *palette = BKE_palette_add(bmain, name);
+       id_us_min(&palette->id);
+       return (Palette *)palette;
+}
+static void rna_Main_palettes_remove(Main *bmain, ReportList *reports, PointerRNA *palette_ptr)
+{
+       Palette *palette = palette_ptr->data;
+       if (ID_REAL_USERS(palette) <= 0) {
+               BKE_libblock_free(bmain, palette);
+               RNA_POINTER_INVALIDATE(palette_ptr);
+       }
+       else {
+               BKE_reportf(reports, RPT_ERROR, "Palette settings '%s' must have zero users to be removed, found %d",
+                           palette->id.name + 2, ID_REAL_USERS(palette));
+       }
+}
+
+static MovieClip *rna_Main_movieclip_load(Main *bmain, ReportList *reports, const char *filepath, int check_existing)
 {
        MovieClip *clip;
 
        errno = 0;
-       clip = BKE_movieclip_file_add(bmain, filepath);
+
+       if (check_existing) {
+               clip = BKE_movieclip_file_add_exists(bmain, filepath);
+       }
+       else {
+               clip = BKE_movieclip_file_add(bmain, filepath);
+       }
 
        if (!clip)
                BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
@@ -685,7 +753,7 @@ static void rna_Main_grease_pencil_remove(Main *bmain, ReportList *reports, Poin
 
 static FreestyleLineStyle *rna_Main_linestyles_new(Main *bmain, const char *name)
 {
-       FreestyleLineStyle *linestyle = BKE_linestyle_new(name, bmain);
+       FreestyleLineStyle *linestyle = BKE_linestyle_new(bmain, name);
        id_us_min(&linestyle->id);
        return linestyle;
 }
@@ -729,6 +797,7 @@ static void rna_Main_sounds_tag(Main *bmain, int value) { BKE_main_id_tag_listba
 static void rna_Main_armatures_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->armature, value); }
 static void rna_Main_actions_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->action, value); }
 static void rna_Main_particles_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->particle, value); }
+static void rna_Main_palettes_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->palettes, value); }
 static void rna_Main_gpencil_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->gpencil, value); }
 static void rna_Main_movieclips_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->movieclip, value); }
 static void rna_Main_masks_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->mask, value); }
@@ -759,16 +828,18 @@ static int rna_Main_sounds_is_updated_get(PointerRNA *ptr) { return DAG_id_type_
 static int rna_Main_armatures_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_AR) != 0; }
 static int rna_Main_actions_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_AC) != 0; }
 static int rna_Main_particles_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_PA) != 0; }
+static int rna_Main_palettes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_PAL) != 0; }
 static int rna_Main_gpencil_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_GD) != 0; }
 static int rna_Main_linestyle_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LS) != 0; }
 
 #else
 
-void RNA_api_main(StructRNA *srna)
+void RNA_api_main(StructRNA *UNUSED(srna))
 {
 #if 0
        FunctionRNA *func;
        PropertyRNA *parm;
+
        /* maybe we want to add functions in 'bpy.data' still?
         * for now they are all in collections bpy.data.images.new(...) */
        func = RNA_def_function(srna, "add_image", "rna_Main_add_image");
@@ -777,8 +848,6 @@ void RNA_api_main(StructRNA *srna)
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm = RNA_def_pointer(func, "image", "Image", "", "New image");
        RNA_def_function_return(func, parm);
-#else
-       (void)srna;
 #endif
 }
 
@@ -1152,6 +1221,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_property_flag(parm, PROP_REQUIRED);
        RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
        RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
+       RNA_def_boolean(func, "stereo3d", 0, "Stereo 3D", "Create left and right views");
        /* return type */
        parm = RNA_def_pointer(func, "image", "Image", "", "New image datablock");
        RNA_def_function_return(func, parm);
@@ -1161,6 +1231,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Load a new image into the main database");
        parm = RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the file to load");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "check_existing", false, "", "Using existing data-block if this file is already loaded");
        /* return type */
        parm = RNA_def_pointer(func, "image", "Image", "", "New image datablock");
        RNA_def_function_return(func, parm);
@@ -1305,6 +1376,7 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Load a new font into the main database");
        parm = RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the font to load");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "check_existing", false, "", "Using existing data-block if this file is already loaded");
        /* return type */
        parm = RNA_def_pointer(func, "vfont", "VectorFont", "", "New font datablock");
        RNA_def_function_return(func, parm);
@@ -1377,6 +1449,7 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Add a new brush to the main database");
        parm = RNA_def_string(func, "name", "Brush", 0, "", "New name for the datablock");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm = RNA_def_enum(func, "mode", object_mode_items, OB_MODE_TEXTURE_PAINT, "", "Paint Mode for the new brush");
        /* return type */
        parm = RNA_def_pointer(func, "brush", "Brush", "", "New brush datablock");
        RNA_def_function_return(func, parm);
@@ -1562,7 +1635,22 @@ void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_struct_sdna(srna, "Main");
        RNA_def_struct_ui_text(srna, "Main Sounds", "Collection of sounds");
 
-       /* TODO, 'load' */
+       /* load func */
+       func = RNA_def_function(srna, "load", "rna_Main_sounds_load");
+       RNA_def_function_ui_description(func, "Add a new sound to the main database from a file");
+       parm = RNA_def_string_file_path(func, "filepath", "Path", FILE_MAX, "", "path for the datablock");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "check_existing", false, "", "Using existing data-block if this file is already loaded");
+       /* return type */
+       parm = RNA_def_pointer(func, "sound", "Sound", "", "New text datablock");
+       RNA_def_function_return(func, parm);
+
+       func = RNA_def_function(srna, "remove", "rna_Main_sounds_remove");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       RNA_def_function_ui_description(func, "Remove a sound from the current blendfile");
+       parm = RNA_def_pointer(func, "sound", "Sound", "", "Sound to remove");
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "tag", "rna_Main_sounds_tag");
        parm = RNA_def_boolean(func, "value", 0, "Value", "");
@@ -1678,7 +1766,41 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_boolean_funcs(prop, "rna_Main_particles_is_updated_get", NULL);
 }
+void RNA_def_main_palettes(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+       FunctionRNA *func;
+       PropertyRNA *parm;
+       PropertyRNA *prop;
+
+       RNA_def_property_srna(cprop, "BlendDataPalettes");
+       srna = RNA_def_struct(brna, "BlendDataPalettes", NULL);
+       RNA_def_struct_sdna(srna, "Main");
+       RNA_def_struct_ui_text(srna, "Main Palettes", "Collection of palettes");
 
+       func = RNA_def_function(srna, "new", "rna_Main_palettes_new");
+       RNA_def_function_ui_description(func, "Add a new palette to the main database");
+       parm = RNA_def_string(func, "name", "Palette", 0, "", "New name for the datablock");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       /* return type */
+       parm = RNA_def_pointer(func, "palette", "Palette", "", "New palette datablock");
+       RNA_def_function_return(func, parm);
+
+       func = RNA_def_function(srna, "remove", "rna_Main_palettes_remove");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       RNA_def_function_ui_description(func, "Remove a palette from the current blendfile");
+       parm = RNA_def_pointer(func, "palette", "Palette", "", "Palette to remove");
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
+
+       func = RNA_def_function(srna, "tag", "rna_Main_palettes_tag");
+       parm = RNA_def_boolean(func, "value", 0, "Value", "");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_boolean_funcs(prop, "rna_Main_palettes_is_updated_get", NULL);
+}
 void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
 {
        StructRNA *srna;
@@ -1742,6 +1864,7 @@ void RNA_def_main_movieclips(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Add a new movie clip to the main database from a file");
        parm = RNA_def_string_file_path(func, "filepath", "Path", FILE_MAX, "", "path for the datablock");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "check_existing", false, "", "Using existing data-block if this file is already loaded");
        /* return type */
        parm = RNA_def_pointer(func, "clip", "MovieClip", "", "New movie clip datablock");
        RNA_def_function_return(func, parm);